package com.competition.commgr.mapper;

import com.competition.commgr.domain.Team;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 团队Mapper接口
 */
public interface TeamMapper {
    /**
     * 查询团队
     *
     * @param teamId 团队主键
     * @return 团队
     */
    public Team selectTeamByTeamId(Long teamId);

    /**
     * 查询团队列表
     *
     * @param team 团队
     * @return 团队集合
     */
    public List<Team> selectTeamList(Team team);

    /**
     * 新增团队
     *
     * @param team 团队
     * @return 结果
     */
    public int insertTeam(Team team);

    /**
     * 修改团队
     *
     * @param team 团队
     * @return 结果
     */
    public int updateTeam(Team team);

    /**
     * 删除团队
     *
     * @param teamId 团队主键
     * @return 结果
     */
    public int deleteTeamByTeamId(Long teamId);

    /**
     * 批量删除团队
     *
     * @param teamIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteTeamByTeamIds(Long[] teamIds);

    // ============== 团队成员管理相关方法 ==============

    /**
     * 查询团队成员
     *
     * @param teamId 团队ID
     * @return 团队成员列表
     */
    List<Team.TeamMember> selectTeamMembers(@Param("teamId") Long teamId);

    /**
     * 检查团队成员是否存在
     *
     * @param teamId 团队ID
     * @param userId 用户ID
     * @return 结果
     */
    int checkMemberExists(@Param("teamId") Long teamId, @Param("userId") Long userId);

    /**
     * 添加团队成员
     *
     * @param teamId 团队ID
     * @param userId 用户ID
     * @param teamType 团队成员类型
     * @return 结果
     */
    int insertTeamMember(@Param("teamId") Long teamId,
                         @Param("userId") Long userId,
                         @Param("teamType") Long teamType);

    /**
     * 修改团队成员
     *
     * @param params 参数Map，包含membersId、teamType、money
     * @return 结果
     */
    int updateTeamMember(Map<String, Object> params);

    /**
     * 删除团队成员
     *
     * @param membersId 成员ID
     * @return 结果
     */
    int deleteTeamMember(@Param("membersId") Long membersId);

    // ============== 奖金信息相关方法 ==============

    /**
     * 查询团队奖金信息
     *
     * @param teamId 团队ID
     * @return 奖金信息
     */
    Map<String, Object> selectTeamBonusInfo(@Param("teamId") Long teamId);

    /**
     * 获取可用用户列表（用于添加团队成员）
     *
     * @return 用户列表
     */
    List<Map<String, Object>> selectAvailableUsers();

    /**
     * 调试用户团队数据
     *
     * @param userId 用户ID
     * @return 调试信息
     */
    List<Map<String, Object>> debugUserTeamsDetail(@Param("userId") Long userId);

    /**
     * 检查所有用户团队
     *
     * @param userId 用户ID
     * @return 检查结果
     */
    Map<String, Object> checkAllUserTeams(@Param("userId") Long userId);

    // ============== 奖金分配相关方法 ==============

    /**
     * 查询团队可分配奖金信息
     *
     * @param teamId 团队ID
     * @return 可分配奖金信息
     */
    List<Map<String, Object>> selectDistributableBonusInfo(@Param("teamId") Long teamId);

    /**
     * 执行奖金分配
     *
     * @param teamId 团队ID
     * @param instructorBonus 指导老师奖金
     * @param participantBonus 参赛选手奖金
     * @return 结果
     */
    int executeBonusDistribution(@Param("teamId") Long teamId,
                                 @Param("instructorBonus") Integer instructorBonus,
                                 @Param("participantBonus") Integer participantBonus);

    /**
     * 查询分配后的奖金结果
     *
     * @param teamId 团队ID
     * @return 分配结果
     */
    Map<String, Object> selectBonusDistributionResult(@Param("teamId") Long teamId);

    /**
     * 检查团队是否有获奖记录
     *
     * @param teamId 团队ID
     * @return 获奖记录数量
     */
    int checkTeamHasAward(@Param("teamId") Long teamId);

    // ============== 重置奖金相关方法 ==============

    /**
     * 重置团队成员奖金（将所有成员的奖金设置为0）
     *
     * @param teamId 团队ID
     * @return 影响的行数
     */
    int resetTeamBonus(@Param("teamId") Long teamId);

    /**
     * 重置指定成员的奖金（设置为0）
     *
     * @param membersId 成员ID
     * @return 影响的行数
     */
    int resetMemberBonus(@Param("membersId") Long membersId);

    // ============== 团队管理权限分配功能 ==============
    /**
     * 检查用户是否为团队的第一位指导老师
     *
     * @param teamId 团队ID
     * @param userId 用户ID
     * @return 如果是第一位指导老师返回1，否则返回0
     */
    int checkIsFirstInstructor(@Param("teamId") Long teamId, @Param("userId") Long userId);

    /**
     * 获取团队的第一位指导老师ID
     *
     * @param teamId 团队ID
     * @return 第一位指导老师的用户ID
     */
    Long getFirstInstructorId(@Param("teamId") Long teamId);
}